#ifndef ISCCN_PDT_API_H
#define ISCCN_PDT_API_H
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
enum {
    PDT_CMD_WRITE_KEYINFO = 0x5050, //从NFC扫描信息写入对讲模块保存
    PDT_CMD_DEVICESTATUS, //上电时，或者定时发送查询当前设备情况
    PDT_CMD_MESSAGE_SEND, //Android侧需要发送一个短信
    PDT_CMD_MESSAGE_RECVD,//对讲侧收到一个短信,通知Android侧显示
    PDT_CMD_ACK_RECVD
};
enum {
    TYPE_DEVICE_STATUS = 100,
    TYPE_DEVICE_LAST_CMD_RESULT = 101
};
#ifdef __cplusplus
extern "C"
{
#endif
/***********************************************************************
获取遥毕状态
1--本终端被杀 , 0 正常
***********************************************************************/
int isccn_pdt_get_killstatus();
/***********************************************************************
isccn_pdt_init:初始化
devName---保TF卡在系统中路径。
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_init(IN const char *devName);
/***********************************************************************
isccn_pdt_exit:退出
devName---保TF卡在系统中路径。
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_exit();
/***********************************************************************
isccn_pdt_write_groupkey:保存扫描后的组信息
devName---保存设备名,TF卡在系统中路径。
input---数据
ilen---数据长度(1024Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_groupkey(IN unsigned char *input, IN int ilen);
/***********************************************************************
isccn_pdt_write_killkey:保存扫描后的销毁信息(每个设备不一样)
devName---保存设备名,TF卡在系统中路径。
input---数据
ilen---数据长度(8Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_killkey(IN unsigned char *input, IN int ilen);
/***********************************************************************
isccn_pdt_write_groupKey_killkey:保存扫描后的信息,包含组码和销毁码
devName---保存设备名,TF卡在系统中路径。
data---数据
groupKeylen---组码长度
killKeylen---销毁码长度
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_write_groupKey_killkey(IN unsigned char *data, IN int groupKeylen, IN int killKeylen);
/***********************************************************************
isccn_pdt_get_keyindex:获取发送数据时使用的ki,IV值[IV(48)+KI(8)+CCSUM(16)=72]
ki---索引号,8bit
value---IV值,48bit
成功>=0 ,失败 < 0
***********************************************************************/
int
isccn_pdt_get_keyindex(IN unsigned int groupid, IN int tmsi, IN int imsi, OUT unsigned char *ki, OUT
                       unsigned char *iv);
/***********************************************************************
isccn_pdt_set_keyindex:设置处理接收到对讲音频数据时使用的ki,IV值
ki---索引号,8bit
value---IV值,48bit
成功>=0 ,失败 < 0
***********************************************************************/
int
isccn_pdt_set_keyindex(IN unsigned char ki, IN unsigned char *iv, IN unsigned int ugi, IN int ismi,
                       IN int tmsi);
/***********************************************************************
isccn_pdt_encode_audiodata:处理原始对讲音频数据
value---原始对讲音频数据,处理完成后也放在此
iLen---数据长度(129Bit,17Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_encode_audiodata(IN unsigned char *value, IN int iLen, unsigned short frmid);
/***********************************************************************
isccn_pdt_decode_audiodata:处理收到的对讲音频数据
value---收到的对讲音频数据,处理完成后也放在此
iLen---数据长度(129Bit,17Bytes)
成功>=0 ,失败 < 0
***********************************************************************/
int isccn_pdt_decode_audiodata(IN OUT unsigned char *value, IN int iLen, unsigned short frmid);

int isccn_pdt_parse_uartcmd(IN unsigned char *in_value, IN int iLen, OUT int *localSend, OUT
                            unsigned char *out_value, IN OUT int *ioLen);
//对讲侧收到短信后调用此
//对讲侧收到短信后调用此 out_value长度最少48字节
int isccn_pdt_parse_supercommand(IN unsigned char *value, IN int *iLen, OUT int *commandID, OUT
                                 int *groupId,
                                 OUT int *terminalId, OUT int *localSend, OUT
                                 unsigned char *out_value, IN OUT int *ioLen);
/***********************************************************************
isccn_pdt_system_command:处理来自外系统的命令(为将来保留功能)
inValue---原始命令信息
iLen---命令长度
outValue---返回信息
oLen---返回信息长度
成功>=0 ,失败 < 0
***********************************************************************/
int
isccn_pdt_system_command(IN unsigned char *inValue, IN int iLen, OUT unsigned char *outValue, OUT
                         int *oLen);


//以下接口供Android侧调用
//获取组密钥,缓冲为1024字节,iLen=1024
int isccn_android_pdt_get_groupkey(OUT unsigned char *gk, IN int iLen);
//获取设备码,缓冲为8字节,iLen=8
int isccn_android_pdt_get_killkey(OUT unsigned char *kk, IN int iLen);
//在通过NFC发送给从机器之前调用此进行消息组合,主机必须先对本机设置了组号，终端编号，终端总数,firstTid为起始编号,
//gk为isccn_android_pdt_get_groupkey
//kk为isccn_android_pdt_get_killkey
//value为andriod侧分配一段内存，数据放到此4096足够
//iLen为分配内存中存放的数据数量
int isccn_android_pdt_get_superkey2NFC(IN int groupId, IN int terminalId, IN int firstTid, IN
                                       int totalTerminalSize, IN int channel_id, IN
                                       int channel_locked, IN unsigned char *gk, IN
                                       unsigned char *kk, OUT unsigned char *value, IN int *iLen);
//从机在获取NFC数据后进行解析,然后将out_value通过UART发送给对讲模块
//in_value为NFC中读取的数据
//iLen为数据长度
//groupId设置从机的组号，AT指令
//terminalId设置从机的终端号，AT指令
//totalTerminalSize从机的总数
//firstTid第一个机器的终端号
//out_value为需要转发给对讲模块数据,分配不小于2048字节
//iLen为需要发给对讲模块数据长度
int
isccn_android_pdt_parse_superkeyFromNFC(IN unsigned char *in_value, IN int iLen, OUT int *groupId,
                                        OUT int *terminalId, OUT int *totalTerminalSize, OUT
                                        int *firstTid, OUT int *channel_id, OUT int *channel_locked,
                                        OUT unsigned char *out_value, IN OUT int *ioLen);
//Android 侧分析URAT返回
typedef struct {
    int cmd;
    int cmdtype;
    int gid;
    int tid;
    int len;
} uartcmd_t;

typedef struct {
    unsigned char device_keyupdated; //updated = 1,0-use origin
    unsigned char device_killed; //killed = 1
} android_pdt_devicestatus;

//Android generate cmd,查询状态，用户自定义数据,out_value缓冲要足够
int isccn_android_pdt_generate_uartcmd(IN unsigned char command_type, OUT unsigned char *out_value, IN
                                   OUT int *ioLen);
//Android 生成摇毙接口,out_value为封装后通过UART发送信息，ioLen为长度,out_value大于32字节
int isccn_android_pdt_send_killmessage(IN int grpid, IN int tid, IN unsigned char *kk, OUT
                                       unsigned char *out_value, IN OUT int *ioLen);
//Android 生成短信接口,out_value为封装后通过UART发送信息，ioLen为长度;mess 必须为16字节,out_value大于48字节
int isccn_android_pdt_send_message(IN int grpid, IN int tid, IN unsigned char *mess, OUT
                                   unsigned char *out_value, IN OUT int *ioLen);
//Android 收到串口信息解析
int isccn_android_pdt_parse_uart_return(IN unsigned char *in_value, IN int iLen, OUT
                                        unsigned char *type, OUT unsigned short *len, OUT
                                        unsigned char **value);

//
//        isccn_android_pdt_generate_uartcmd 用来产生串口上的命令，命令为PDT_CMD_DEVICESTATUS，
//        当cmdtype=TYPE_DEVICE_STATUS返回android_pdt_devicestatus，当cmdtype=TYPE_DEVICE_LAST_CMD_RESULT，返回命令执行结果
//
//        isccn_android_pdt_send_killmessage，产生遥毙命令，返回结果可直接通过AT+BINARY发送
//
//        isccn_android_pdt_send_message产生短消息命令，返回结果可直接通过AT+BINARY发送
//
//        isccn_android_pdt_parse_uart_return分析AT+BINARY的结果


#ifdef __cplusplus
}
#endif

#endif	/* ISCCN_PDT_API_H */

